#include <stdio.h>
#include <stdlib.h>
#define MaxSize 1000000
#define ERROR -1
typedef char ElementType;
typedef struct {
    ElementType data[MaxSize];  
    int top;       
}SqStack;
void InitStack(SqStack *&s);
void DestroyStack(SqStack *&s);
bool Push(SqStack *&s,ElementType e);
bool Pop(SqStack *&s,ElementType &e);
bool GetTop(SqStack *s,ElementType &e);
bool StackEmpty(SqStack *s);
bool Match(ElementType exp[],int n,ElementType &ch);
int main()
{
	SqStack *s;
	int n,m;
	int i=0; 
	ElementType ch;
	ElementType str[MaxSize];
	while (1) {  
		str[i]=getchar();	
		if (str[i] == '\n'&&str[i - 1] == '.') break;
		i++;
	}
	str[i] = '\0';
    n=i;
	Match(str,n,ch);
	return 0;
	
}
void InitStack(SqStack *&s)
{
	s=(SqStack *)malloc(sizeof(SqStack));
	s->top=-1;
}

void DestroyStack(SqStack *&s)
{
	free(s);
}

bool Push(SqStack *&s,ElementType e)
{
	if(s->top==MaxSize-1)
	    return false;
	s->top++;
	s->data[s->top]=e;
	return true;
}

bool Pop(SqStack *&s,ElementType &e)
{
	if(s->top==-1)
	    return false;
	e=s->data[s->top];
	s->top--;
	return true;
}

bool GetTop(SqStack *s,ElementType &e)
{
	if(s->top==-1)
	     return false;
	e=s->data[s->top];
	return true;
}

bool StackEmpty(SqStack *s)
{
	return (s->top==-1);
}

bool Match(ElementType exp[],int n,ElementType &ch)
{
	int i=0,j=0,k=0;char e;
	ElementType a[100];
	SqStack *st;
	bool match=true;
	InitStack(st);
	for(i=0;i<n;i++)
	{
		if(exp[i]=='('||exp[i]=='('||exp[i]==')'||exp[i]=='{'||exp[i]=='}'||exp[i]=='['||exp[i]==']'){
			a[j++]=exp[i];
		}
		else if(exp[i]=='/'&&exp[i+1]=='*'){
			a[j++]='a';
			i++;
		}
		else if(exp[i]=='*'&&exp[i+1]=='/'){
			a[j++]='b';
			i++;
		}
	}
	int flag=0;
	for(k=0;a[k];k++)
	{
		if(a[k]=='('||a[k]=='{'||a[k]=='['||a[k]=='a')
		    Push(st,a[k]);
		else if(a[k]==')'){
		    if(GetTop(st,e)==false){
				flag=1;
				printf("NO\n");
				printf("?-)");
				break;
			}	
			else if(GetTop(st,e)==true)
			{
				if(e=='('&&!StackEmpty(st)){
					Pop(st,e);
				}
				else{
					printf("NO\n");
					if(StackEmpty(st)&&flag==0){
						printf("?-)\n");
						flag=1;
						break;
					}   
			        else{
			        	flag=1;
			        	if(st->data[st->top]=='a'){
							printf("/*-?");
							break;
						}
			        	    
			        	else{
			        		printf("%c-?",st->data[st->top]);
			        		break;
						}
					}
				}
				    
			}
		
		}
		else if(a[k]=='}'){
			if(GetTop(st,e)==false){
				flag=1;
				printf("NO\n");
				printf("?-}");
				break;
			}
			else if(GetTop(st,e)==true)
			{
				if(e=='{'&&!StackEmpty(st)){
					Pop(st,e);
				}
				else{
					printf("NO\n");
					if(StackEmpty(st)&&flag==0){
						printf("?-}\n");
						flag=1;
						break;
					}   
					else{
						flag=1;
						if(st->data[st->top]=='a'){
							printf("/*-?");
							break;
						}
			        	    
			        	else{
			        		printf("%c-?",st->data[st->top]);
			        		break;
						}
					}
				}
				    
			}
	
		}

		else if(a[k]==']'){
			if(GetTop(st,e)==false){
				flag=1;
				printf("NO\n");
				printf("?-]");
				break;
			}
			else if(GetTop(st,e)==true)
			{
				if(e=='['){
					Pop(st,e);
				}
				else{
					printf("NO\n");
					if(StackEmpty(st)&&flag==0)   {
						printf("?-]\n");
						flag=1;
						break;
					}
					else{
						flag=1;
						if(st->data[st->top]=='a'){
							printf("/*-?");
							break;
						}
			        	    
			        	else{
			        		printf("%c-?",st->data[st->top]);
			        		break;
						}
					}
				}
				    
			}

			
		}
	
		else if(a[k]=='b'){
			if(GetTop(st,e)==false){
				flag=1;
				printf("NO\n");
				printf("?-*/");
				break;
			}
			else if(GetTop(st,e)==true)
			{
				if(e=='a'){
					Pop(st,e);
				}
				else{
					printf("NO\n");
					if(StackEmpty(st)&&flag==0)
					{
						printf("?-*/\n");
						flag=1;
						break;
					   }   
					else{
						flag=1;
						if(st->data[st->top]=='a'){
							printf("/*-?");
							break;
						}
			        	    
			        	else{
			        		printf("%c-?",st->data[st->top]);
			        		break;
						}
			        	    
					}
				}
				    
			}
		}

	}
	if(StackEmpty(st)&&flag==0)
	   printf("YES");
    if(!StackEmpty(st)&&flag==0){
    	printf("NO\n");
    	if(st->data[0]=='(') printf("(-?\n");
    	else if(st->data[0]=='{') printf("{-?\n");
    	else if(st->data[0]=='[') printf("[-?\n");
    	else if(st->data[0]=='a') printf("/*-?\n");
	}
	DestroyStack(st);
	return match;
}
